package com.chen.concurrent.jmm;

/**
 * java 内存模型
 */
public class JavaMemoryModelTest {

    /**
     * 主内存中的值
     */
    static boolean run = true;

    //volatie 易见性，解决可见性问题，保证线程每次取值都从主内存中取，保证取到了最新值，牺牲了一定的性能
    private static volatile boolean flag;


    public static void main(String[] args) {


    }

    /**
     * 问题1 :可见性
     *
     * 需要保证指令不会收到CPU缓存的影响
     */
    private static void m(){
        Thread thread = new Thread(() -> {
            //从主内存中读取 run的值，之后JIT编译器就回把这个值缓存的线程的工作内存中，提高效率；
            while (run) {
                System.out.println("run...");
            }
        });


        thread.start();

        //更新主内存的值， 但是thread 工作内存的值并不会修改，所有线程继续循环运行
        run = false;
    }

    /**
     * 解决m() 可见性问题
     */
    private static void m1(){
        Thread thread = new Thread(() -> {
            //每次都从主内存中取flag的值
            while (flag) {
                System.out.println("run...");
            }
        });


        thread.start();

        //更新主内存的值， 但是thread 工作内存的值并不会修改，所有线程继续循环运行
        flag = false;
    }

}
